package com.example.utils.util;


/**
 * TODO   两数除法
 *
 * @ClassName DivUtil
 * @Author xiaojiang
 * @Date 2021/9/27 下午 18:00
 */
public class DivUtil {

    /**
     *  TODO  两数相除
     * @Param : numStr1  数1(被除数)
     * @Param : numStr2  数2(除数,不能超过long型)
     * @return String    结果
     * @Author 江
     * @Date 2021/9/27 下午 18:03
     */
    public static String divide(String numStr1, String numStr2) {
        int numLen1 = numStr1.length();
        int numLen2 = numStr2.length();

        int[] numArray1 = new int[numLen1]; // 数字数组
        int[] numArray2 = new int[numLen2];

        // "12345"-> [5,4,3,2,1]
        for (int i = 0; i < numLen1; i++) {
            String c = numStr1.substring(i, i + 1);
            numArray1[numLen1 - i - 1] = Integer.parseInt(c); // 低位存字符串尾部数字
        }
        for (int i = 0; i < numLen2; i++) {
            String c = numStr2.substring(i, i + 1);
            numArray2[numLen2 - i - 1] = Integer.parseInt(c); // 低位存字符串尾部数字
        }

        int effectiveNum = (numLen1 >= numLen2 ? numLen1 : numLen2) + 16; // 有效位数:
        // 默认大数长度+16
        int[] resultArray = new int[effectiveNum]; // 高位存高位

        // 将被除数的每一位除以除数，取整为该位结果，取余暂存借给低位(除数不能大过long型，除非除法转换为减法)
        long yu = 0;
        int resultIndex = effectiveNum - 1;
        for (int i = numArray1.length - 1; i >= 0; i--) {
            long num = yu * 10 + numArray1[i]; // 被除数该位为：余数*10+自己
            int r = (int) (num / Long.parseLong(numStr2)); // 取整
            yu = num % Long.parseLong(numStr2); // 取余
            resultArray[resultIndex--] = r;
        }
        int decimalPoint = effectiveNum - numArray1.length - 1; // 小数点位置
        if (yu != 0) {
            int decimal = decimalPoint; // 小数
            for (int i = 0; i < effectiveNum - numArray1.length; i++) {
                long num = yu * 10 + 0; // 小数部分被除数补0
                int r = (int) (num / Long.parseLong(numStr2)); // 取整
                yu = num % Long.parseLong(numStr2); // 取余
                resultArray[decimal--] = r;
                if (yu == 0) {
                    break; // 余数为0，提前退出
                }
            }
        }

        // 拼接结果
        StringBuilder builder = new StringBuilder();
        boolean existHighNotZero = false;
        for (int i = effectiveNum - 1; i >= 0; i--) {
            if (i == decimalPoint) {
                builder.append(".");
            }
            if (resultArray[i] == 0) {
                if (!existHighNotZero && i > decimalPoint + 1) { // 跳过高位无用的0
                    continue;
                }
            } else {
                existHighNotZero = true;
            }
            builder.append(resultArray[i]);
        }
        String result = builder.toString();
        // 去除尾部无用的0
        int endIndex = result.length();
        for (int i = result.length() - 1; i >= 0; i--) {
            char c = result.charAt(i);
            if (c != '0') {
                endIndex = i + 1;
                break;
            }
        }
        // 去除多余的小数点
        if (result.charAt(endIndex - 1) == '.') {
            endIndex = endIndex - 1;
        }
        result = result.substring(0, endIndex);
        return result;
    }

    public static void main(String[] args) {
        String aaa = "891";
        String bbb = "49825814373";
        String divide = divide(aaa, bbb);
        System.out.println(divide);
    }

}
